using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using SqlSugar;

namespace DiLu.Expansion.DataStorage.Common.ColumnDataConverts;

/// <summary>
///     提供枚举列表与字符串之间的转换功能，主要用于数据库操作中的参数转换和查询结果转换。
///     实现了 ISugarDataConverter 接口，支持将枚举列表序列化为 JSON 字符串以及将 JSON 字符串反序列化为枚举列表。
///     转换过程中使用了 System.Text.Json 库，并配置了 JsonStringEnumConverter 以支持枚举类型的字符串表示。
/// </summary>
public class EnumListConvert : ISugarDataConverter
{
    private static JsonSerializerOptions JsonStringEnumOptions => new()
    {
        WriteIndented = false, // 格式化输出
        Converters = { new JsonStringEnumConverter() } // 序列化枚举为字符串
    };

    public SugarParameter ParameterConverter<T>(object columnValue, int columnIndex)
    {
        var type = typeof(T);
        if (type.IsGenericType && type.GetGenericTypeDefinition() != typeof(List<>))
            throw new ArgumentException("ParameterConverter 仅支持 List 类型。");

        return new SugarParameter($"@enumList{columnIndex}", JsonSerializer.Serialize(columnValue, JsonStringEnumOptions));
    }

    public T QueryConverter<T>(IDataRecord dataRecord, int dataRecordIndex)
    {
        var type = typeof(T);
        if (type.IsGenericType && type.GetGenericTypeDefinition() != typeof(List<>))
            throw new InvalidOperationException("QueryConverter 仅支持 List 类型。");
        var json = dataRecord.GetValue(dataRecordIndex);
        if (json == DBNull.Value || string.IsNullOrWhiteSpace($"{json}"))
        {
            var entity = new List<byte>();
            return (T)(object)entity;
        }

        return JsonSerializer.Deserialize<T>($"{json}", JsonStringEnumOptions);
    }
}